#include "../my_codeh/readdir.h"

LinkedList *create_doublelist()
{//	1、创建一个管理结点
	LinkedList *l = (LinkedList *)malloc(sizeof(*l));
    //	2、对管理结点进行初始操作(此时为空链表)
    l->first = NULL;	//	指向单链表的第一个结点(空链表)
    l->last = NULL;		//	指向单链表的最后一个结点(空链表)
    l->nodenum=0;
    //	3、管理结点返回
    return l;
}

void insert_head_doublelist(LinkedList* l, ElemType data) 
{
    if(l)
    {   
        Node* newNode = (Node*)malloc(sizeof(Node));
        newNode->data = (ElemType)malloc(strlen(data) + 1);///!!!首先是给这个指针类型的data申请空间，空间根据输入的字长加1《\0》
        strcpy(newNode->data, data);//!!!!然后将这个data的值赋给newNode->data，这里是字符串所以只能用strcpy函数
        newNode->prev = NULL;
        newNode->next = NULL;
        
        if(l->nodenum==0)
        {
            l->first=l->last=newNode;
            newNode->prev=newNode;
            newNode->next=newNode;
        }
        else
        {   
            Node* p =l->first;
            do
            {
                if(strcmp(p->data,data)>0)
                {
                    break;
                }
                p=p->next;
            }while(p!=l->first);
            
            //找到了，或者没找到都有可能
            if(p==l->first)
            {
                newNode->next=l->first;
                l->first->prev=newNode;
                l->first=newNode;
                l->first->prev=l->last;
                l->last->next=l->first;
            }
             else if(p==l->last->next)//p回到首结点，说明要插在尾部
            {
                newNode->prev=l->last;
                l->last->next=newNode;
                l->last=newNode;
                l->last->next=l->first;
                l->first->prev=l->last;
            }
            else
            {
                //查到中间
                p->prev->next=newNode;
                newNode->prev=p->prev;
                p->prev=newNode;
                newNode->next=p;
            }

        }
        l->nodenum++;
    }
}

void printList(LinkedList* l)
{
    if (!l || !l->first) 
    {
        printf("链表为空\n");
        return;
    }
    Node* p=l->first;
    do{
        printf("%s\n",p->data);
        p=p->next;
    }while(p!=l->first);
    printf("\n");
}

// 拼接链表所有节点数据为一个字符串的函数

LinkedList* readdir_mp3()
{
    DIR *dir = opendir("./");    //  打开 指定目录
    if(dir == NULL)                 //  打开错误
    {
        perror("opendir error");    //  解析错误
        return NULL;
    }
    LinkedList* list = create_doublelist();
    struct dirent *p = NULL;
    while(p = readdir(dir))
    {
        if(strcmp(p->d_name,".")==0||strcmp(p->d_name,"..")==0)
        {
            continue;
        }
        switch(p->d_type)
        {
			case DT_DIR:    break;
			case DT_REG:    if(strstr(p->d_name,".mp3")) {insert_head_doublelist(list, p->d_name); } break;
        }

    }
    //搜索
    printf("音频列表: \n");
    printList(list);
    closedir(dir);
    return list;
}